from rol import Rol, db_session
from sqlalchemy import exc
from flask import flash
from proyecto import Proyecto
from fase import Fase
from usuario import Usuario
session = db_session()

class RolManager(object):
    """Clase encargada del manejo de roles"""
    def __init__(self):
        pass
    def __repr__(self):
        return '<Rol Manager>'
    
    def guardarRol(self, rol):
        """
        Metodo encargado de almacenar un rol en la base de datos
        @param rol: Objeto rol que se desea guardar.
        """
        session.add(rol)
        try:
            session.commit()
        except exc.IntegrityError as ex:
            session.rollback()
            return flash("El rol ya existe", "error")
        else:
            return flash("Rol registrado exitosamente")
        
    def eliminarRol(self, idrol):
        """
        Metodo encargado de eliminar un rol de la base de datos
        @param idrol: id del rol que se desea eliminar.
        """
        rol = session.query(Rol).filter(Rol.idrol == idrol).first()
        session.delete(rol)
        session.commit()
        
    def getRol(self, idrol):
        """
        Metodo encargado de retornar un rol de la base de datos
        @param idrol: id del rol que se desea obtener.
        """
        rol = session.query(Rol).filter(Rol.idrol == idrol).first()
        return rol
    
    def getRoles(self):
        """Metodo encargado de retornar todos los roles de la base de datos"""
        roles = session.query(Rol).order_by(Rol.nombre)
        return roles
    
    def getRolFiltradoPorNombre(self, nombre):
        """
        Metodo encargado de retornar un rol dado su nombre
        @param nombre: nombre del rol que se desea obtener.
        """
        if nombre == "":
            nombre = "%"
        else:
            nombre = "%" + nombre + "%"
        rol = session.query(Rol).filter(Rol.nombre.like(nombre)).order_by(Rol.nombre).all()
        return rol
    
    def getRolFiltradoPorNombreProyecto(self, nombre, idproyecto):
        """
        Metodo encargado de retornar los roles de un proyecto dado
        @param nombre: nombre del rol que se desea obtener.
        @param idproyecto: id del proyecto cuyos roles se desean obtener.
        """
        if nombre == "":
            nombre = "%"
        else:
            nombre = "%" + nombre + "%"
        rol = session.query(Rol).join(Fase).join(Proyecto).filter(Proyecto.idproyecto==idproyecto).\
                                        filter(Rol.nombre.like(nombre)).order_by(Rol.nombre).all()
        return rol
    
    def getRolPorNombre(self, nombre):
        """
        Metodo encargado de retornar un rol dado su nombre
        @param nombre: nombre del rol que se desea obtener.
        """
        rol = session.query(Rol).filter(Rol.nombre == nombre).first()
        return rol
    
    def getUsuariosDelRol(self, idrol):
        """
        Metodo encargado de retornar los usuarios de un rol
        @param idrol: id del rol cuyos usuarios se desean obtener.
        """
        rol = session.query(Rol).filter(Rol.idrol==idrol).all()
        return rol.usuarios
    
    def getPermisosDelRol(self, idrol):
        """
        Metodo encargado de retornar los permisos de un rol
        @param idrol: id del rol cuyos permisos se desean obtener.
        """
        rol = session.query(Rol).filter(Rol.idrol==idrol).all()
        return rol.permisos
    
    def getRolesPaginado(self, idproyecto, nombre, desde, hasta):
        """
        Metodo encargado de retornar un usuario dado su nombre
        @param idproyecto: id del proyecto cuyos roles se desean obtener.
        @param nombre: nombre del rol que se desea obtener.
        @param desde: indica inicio.
        @param hasta: indica fin.
        """
        if nombre == "":
            nombre = "%"
        else:
            nombre = "%"+nombre+"%"

        if desde != None and hasta != None:
            roles = session.query(Rol).join(Fase).join(Proyecto).filter(Proyecto.idproyecto==idproyecto).\
                                        filter(Rol.nombre.like(nombre)).order_by(Rol.nombre)[desde:hasta]
            return roles
        else:
            total = session.query(Rol).join(Fase).join(Proyecto).filter(Proyecto.idproyecto==idproyecto).\
                                        filter(Rol.nombre.like(nombre)).count()
            return total
        
    def getRolesDelUsuarioPorProyecto(self, idusuario, idproyecto):
        """
        Metodo encargado de retornar los roles de un usario determinado del proyecto
        @param idusuario: id del usuario cuyos roles se desean obtener.
        @param idproyecto: id del proyecto cuyos roles se desean obtener.
        """
        roles = session.query(Rol).join(Usuario, Rol.usuarios).join(Fase).join(Proyecto).filter(Proyecto.idproyecto==idproyecto).\
            filter(Usuario.idusuario==idusuario).order_by(Rol.nombre).all()
        return roles
    

